<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!-- <p>动态规划（Dynamic Programming，DP）是一种将复杂问题分解成更小的子问题来解决的优化技术</p> -->
  <!-- <script src="./最少硬币找零问题.js"></script> -->
  <script>


    // let singLetn = function (name) {
    //   this.name = name;
    //   this.instance = null
    // }
    // // singLetn.instance = 9   不会执行进入   注释掉  就可以

    // singLetn.getInstance = function (name) {
    //   if (!this.instance) {
    //     console.log('进入')
    //     this.instance = new singLetn(name)
    //   }
    //   // 这里的this 是singLetn构造函数   不是实例对象
    //   return this.instance
    // }

    // let a = singLetn.getInstance('7')
    // let b = singLetn.getInstance('8')
    // console.log(singLetn.instance)
    // console.log(a == b)

    // function test() {
    //   // this.是往实例属性上加
    //   console.log(this)
    //   let cc = 'pp'
    //   this.time = '987'
    //   console.log(cc)
    // }
    // let ppppp = new test()

    // let str = 'heshihao'
    // console.log(str.charAt(1))
    // console.log(str[1])//没有区别  都可以获得到e

    // class Person {
    //   constructor() {
    //     this.sex = '女'
    //   }
    //   static getName() {
    //     console.log(this.sex)
    //   }
    //   static sex = '男'
    // }


    // let p9 = new Person()
    // Person.getName()



    // function foooo() {
    //   let instance = 'pppp'
    //   this.instance = null
    // }
    // foooo.instance = 'name'

    // foooo.getName = function () {
    //   console.log(this.instance)
    // }

    // let f8 = new foooo()
    // foooo.getName()

    // async function fun1() {
    //   console.log('fn1')
    //   let data = await fun2()
    //   console.log(data)
    //   console.log('fn1 end')
    // }
    // async function fun2() {
    //   console.log('898')
    //   // return new Promise((res, rej) => {
    //   //   console.log('promise898')
    //   //   res('async promise')
    //   // })
    // }


    // fun1()

    // new Promise((res, rej) => {
    //   console.log('皮肉mise')
    //   res('9999')
    // }).then(res => {
    //   console.log(res)
    // })

    // console.log('xixiix')

    // function* foo(num) {
    //   console.log("函数开始执行~")

    //   const value1 = 100 * num
    //   console.log("第一段代码:", value1)
    //   const n = yield value1            //接受n参数  10

    //   const value2 = 200 * n   //这里也就是下面第二个next的值
    //   console.log("第二段代码:", value2)
    //   const count = yield value2       //接受count参数  25

    //   const value3 = 300 * count
    //   console.log("第三段代码:", value3)
    //   yield value3
    // }
    // // 生成器上的next方法可以传递参数
    // const generator = foo(5)       //第一个参数直接传递
    // // 函数开始执行~
    // // 第一段代码: 500   并传递参数10  const n = yield value1
    // console.log(generator.next())    // { value: 500, done: false }

    // // 第二段代码: 5000    并传递参数20  const count = yield value2
    // console.log(generator.next(25))


    // console.log('开始')

    // function foo() {
    //   console.log('pp')
    //   return () => {
    //     console.log('执行完成')
    //   }
    // }

    // setTimeout(foo(), 0)


    // setTimeout(foo, 0)

    // new Promise((res, rej) => {
    //   console.log('皮肉')
    //   res(99)
    // }).then(res => {
    //   console.log(res)
    // })

    // let obj = {
    //   // 对象在有运算符的时候，会首先调用valueOf  没有valueOf再去调用tostring
    //   a: 1,
    // }

    // let nums = [1, 2, 3]

    // if (1 == 1) {
    //   console.log(nums.toString())   //跟join一样
    //   console.log(nums.valueOf())  //返回本身
    //   console.log(obj.toString())   //[object Object]
    //   console.log(obj.valueOf())  //返回本身
    //   console.log(Object.prototype.toString.call(nums))//[object Array]
    // }


    function foo(name, age) {
      this.name = name
      this.age = age

      // return {
      //   name: 99
      // }
    }
    foo.prototype.colors = [1, 2, 3]

    let f = new foo('heshihao', 18)
    let p = new foo('hh', 18)

    f.colors.pop()
    console.log(f.colors)
    console.log(p.colors)

    let pp = Object.create(f, { name: { value: 555 } })
    console.log(pp.__proto__ == f)
    console.log(pp.name)


    // let f = new foo('heshihao', 19)
    // console.log(f)


    // 手写new
    function _new(fn, ...arg) {
      let obj = {}
      obj.__proto__ = fn.prototype;
      let res = fn.apply(obj, arg)
      if ((res != null) && (typeof res == 'function' || typeof res == 'object')) {
        return res
      }
      return obj
    }

    function _new() {
      let Constructor = [].shift.call(arguments)
      console.log(Constructor, '构造器')
      let obj = {}
      Object.setPrototypeOf(obj, Constructor.prototype)
      let res = Constructor.apply(obj, arguments)
      console.log(arguments, '实参')
      return res instanceof Object ? res : obj
    }
    // let f1 = _new(foo, 'heshiihao', 19)
    // f1.say()

    // // console.log(f1.say())
    // // console.log(f1.__proto__ == foo.prototype)

    // function foo2() {

    // }
    // foo2.prototype.hello = function () {
    //   console.log('hello')
    // }

    // Object.setPrototypeOf(f1, foo2.prototype)
    // f1.hello()




    // let s = new String('heshihao')
    // function bar() {

    // }
    // let b = new bar()
    // // 一下输出结果都是true
    // console.log(bar.__proto__.__proto__ == bar.prototype.__proto__)
    // console.log(bar.prototype.__proto__ == Object.prototype)
    // console.log(b.__proto__ == bar.prototype)
    // console.log(b.__proto__.__proto__ == Object.prototype)
    // console.log(String.__proto__ == Function.prototype)
    // console.log(s.__proto__ == String.prototype)

    // let obj = {
    //   cc: 1
    // }
    // let o = {

    // }
    // Object.setPrototypeOf(o, obj)    //将obj设置为o的__proto__

    // console.log(o.__proto__ == obj)

    // console.log(obj)




  </script>

</body>

</html>